#ifndef SERVICIOMUNDO_H
#define	SERVICIOMUNDO_H

#include <vector>
#include "Servicio.h"
#include "MundoServicioConstantes.h"
#include "ExploradorDirectorios.h"
#include "tinyxml.h"
#include "Mundo.h"

using std::vector;
using namespace TP::IO;
using namespace TP::Juego;

/**
 * Esta clase modela el servicio de mundos que presta el servidor, i.e.:
 * 1º- Proveer la lista de mundos.
 * 2º- Proveer la lista de niveles.
 * 
 * Para poder usarla en el constructor se le debe pasar la ruta relativa o abso-
 * luta del directorio donde se encuentran los XML de los mundos y luego llamar
 * al método iniciar(). A partir de ahí se puede comenzar a realizar consultas.
 */
namespace TP { namespace Servicios {

class MundoServicio: public Servicio {
public:
    /**
     * Crea un nuevo servicio de mundos.
     * @param pathMundos Path absoluto o relativo del directorio en donde se en-
     * cuentran los archivos con información los mundos existentes.
     */
    MundoServicio(const string &pathMundos);
    
    // Libera los recursos asociados con la instancia.
    virtual ~MundoServicio();
    
    /**
     * Carga en memoria principal la información sobre los mundos y niveles dis-
     * ponibles.
     */
    virtual void iniciar();
    
    // Aca no hace nada.
    virtual void finalizar();

    Mundo* getMundoPorNombre(const string& pNombreMundo);
    
    /**
     * Procesa un mensaje recibido de un cliente y en caso de poder interpretar-
     * lo, genera una respuesta y la envía al usuario que realizo la consulta.
     * @param pMensajero Objeto encargado de enviar la respuesta del servicio.
     * @param pMensaje Consulta a resolver.
     */
    void mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje);
        
private:
    /**
     * @return Retorna una lista de los mundos disponibles en una cadena con el
     * siguiente formato: "mundo1 \n mundo2 \n ... \n mundoN \n", sin los espacios
     * en blanco.
     */
    void __listarMundos(IMensajero* pMensajero);
    
    /**
     * @return Retorna una lista de los niveles correspondientes para un mundo 
     * dado con el siguiente formato: "nivel1 \n nivel2 \n ... \n nivelN \n", 
     * sin los espacios en blanco.
     */
    void __listarNiveles(IMensajero* pMensajero, vector<string>& pComando);
    
private:
    string _pathMundos;
    ExploradorDirectorios _exploradorDirectorios;
};

}}

#endif	/* SERVICIOMUNDO_H */

